package com.decent.common.oss.config;

import cn.hutool.core.util.ObjectUtil;
import com.decent.common.enums.ErrorCodeEnum;
import com.decent.common.exception.ErrorCodeException;
import com.decent.common.util.BeanUtils;
import lombok.Data;

/**
 * 阿里巴巴oss对象存储配置信息
 *
 * @author wangyx
 */
@Data
public abstract class AbstractOssConfig {
    /**
     * 阿里云账号id
     */
    private String accessKeyId;
    /**
     * 阿里云账号密钥
     */
    private String accessKeySecret;
    /**
     * 存储空间
     */
    private String bucketName;
    /**
     * 存储根目录
     */
    private String basePath;
    /**
     * 对象存储oss外网endpoint
     */
    private String endPoint;
    /**
     * 对象存储oss内网endpoint
     */
    private String innerEndPoint;
    /**
     * 对象存储oss公共endpoint
     */
    private String publicEndPoint;

    /**
     * 初始化对象存储配置信息：
     * accessKeyId     应用id
     * accessKeySecret 应用密钥
     * bucketName      存储空间
     * basePath        根目录
     * endPoint        默认endPoint，用于服务读取文件
     * innerEndPoint   内网endpoint，用于上传及删除
     * publicEndPoint  公共endPoint，用于将文件设置为公共读
     */
    abstract public void init();

    /**
     * 获取并校验oss配置信息
     *
     * @return oss配置信息
     */
    public static AbstractOssConfig createOssConfig() {
        Object ossConfig = BeanUtils.getBean("OssConfig");
        if (ObjectUtil.isNull(ossConfig) || !(ossConfig instanceof AbstractOssConfig)) {
            throw new ErrorCodeException(ErrorCodeEnum.ERROR, "对象存储功能未支持");
        }
        AbstractOssConfig config = (AbstractOssConfig) ossConfig;
        config.check();
        return config;
    }

    /**
     * 配置信息校验
     */
    public void check() {
        this.init();
        if (ObjectUtil.hasNull(this.accessKeyId, this.accessKeySecret, this.bucketName, this.basePath, this.endPoint,
                this.innerEndPoint, this.publicEndPoint)) {
            throw new ErrorCodeException(ErrorCodeEnum.ERROR, "对象存储配置信息有误");
        }
    }
}
